//
//  ABNetworkTools.swift
//  microblog
//
//  Created by 安波 on 15/10/28.
//  Copyright © 2015年 anbo. All rights reserved.
//

import UIKit
import AFNetworking

// MARK: 网络错误枚举
enum ABNetworkError: Int {
    case emptyToken = -1
    case emptyUID = -2
    
    // 枚举里面可以有属性
    var description: String{
        get{
            // 根据枚举的类型返回对应错误
            switch self {
            case ABNetworkError.emptyToken:
                return "access_token为空"
            case ABNetworkError.emptyUID:
                return "uid为空"
            }
        }
    }
    
    // 枚举可以定义方法
    func error() -> NSError{
        return NSError(domain: "smallwave_Networking_error", code: rawValue, userInfo: ["errorDescription" : description])
    }
}

class ABNetworkTools: NSObject {
    
    // 属性
    private var afnManager:AFHTTPSessionManager
    
    // 创建单例
    static let sharedInstance: ABNetworkTools = ABNetworkTools()
    
    override init() {
        let urlString = "https://api.weibo.com/"
        afnManager = AFHTTPSessionManager(baseURL: NSURL(string: urlString))
        afnManager.responseSerializer.acceptableContentTypes?.insert("text/plain")
    }
    
    /// 1.创建网络单例工具（继承AFN）
//    static let sharedInstance: ABNetworkTools = {
//        // 接口路径
//        let baseURL = NSURL(string: "https://api.weibo.com/")
//        // 根据baseURL创建单例工具
//        let tools = ABNetworkTools(baseURL: baseURL)
//        
//        // Set  设置修改acceptableContentTypes属性  将在原有的值上加"text/plain"拼接
//        tools.responseSerializer.acceptableContentTypes?.insert("text/plain")
//        
//        // 返回创建的工具
//        return tools
//    }()
    
    
    // MARK: - OAuth授权
    // 2.OAuth授权
    /// 2.0申请应用时，分配的APPKey
    private let client_id = "296455517"
    
    /// 申请应用时，分配的AppSecret
    private let client_secret = "d017505f61aa32f4a727c0bbb15bb2bb"
    
    /// 请求的类型，填写authorization_code（这是一个固定字符串）
    private let grant_type = "authorization_code"
    
    /// 2.1回调地址  在授权询问加载中，需要使用，所以这里不应把属性定义为私有的
    let redirect_uri = "http://www.baidu.com/"
    
    /// OAuthURL 地址
    func oauthURl() -> NSURL {
        // 拼接测试地址: 2.0 + 2.1 
        let urlString = "https://api.weibo.com/oauth2/authorize?client_id=\(client_id)&redirect_uri=\(redirect_uri)"
        // 返回拼接好的地址(注意：以上地址是字符型，需要转换为NSURL，且需要强制拆包处理)
        return NSURL(string: urlString)!
    }
    
    
    // 告诉调用者  使用闭包回调 finshed:(result: [String:AnyObject]?,error: NSError?) -> ()
    // MARK: - 加载AccessToken
    /// 加载AccessToken
    func loadAccessToken(code: String,finshed:NetworkFinishedCallback){
        // url 
        let  urlString = "oauth2/access_token"
        
        // 参数
        let parameters = [
            "client_id":client_id,
            "client_secret":client_secret,
            "grant_type":grant_type,
            "code":code,
            "redirect_uri":redirect_uri
        ]
        // 测试返回结果类型  这是二进制数据  需要转换编码输出
//        responseSerializer = AFHTTPResponseSerializer()
        
        //  下面的参数result：是请求结果
        afnManager.POST(urlString, parameters: parameters, success: { (_, result) -> Void in
            
            // 测试返回结果
//            let data = String(data:result as! NSData,encoding:NSUTF8StringEncoding)
//            print("data: \(data)")
            
            //  结果需要类型强转  result as? [String: AnyObject]  强转可能成功，也可能失败，因此定义闭包的回调参数为“可选”类型
            // 成功时的回调
            finshed(result: result as? [String: AnyObject], error: nil)
            
            }) { (_, error:NSError) -> Void in
                
                //  失败时的回调
                finshed(result: nil, error: error)
        }
 
    }
    
    
    // MARK: - 获取用户信息
    func loadUserInfo(finshed: NetworkFinishedCallback){
        // 判断access_token 
        if ABUserAccount.loadAccount()?.access_token == nil {
//            print("没有Access_Token")
            // 自定义error
            /*
                domain：自定义，表示错误的范围
                code：错误代码：自定义负数开头
                userInfo：错误附加信息
            */
//            let error = NSError(domain: "smallwave_Networking_error", code: -1, userInfo: ["description" : "没有Access_Token"])
//            // 告诉调用者
//            finshed(result: nil, error: error)
            
            // 创建枚举
            let emptyTokenE = ABNetworkError.emptyToken
            let error = NSError(domain: "smallwave_Networking_error", code: emptyTokenE.rawValue, userInfo: ["description" : emptyTokenE.description])
            
            // 告诉调用者
            finshed(result: nil, error: error)
            
            return
        }
        
        // 判断uid
        if ABUserAccount.loadAccount()?.uid == nil {
//            print("没有uid")
            // 自定义 error
//            let error = NSError(domain: "smallwave_Networking_error", code: -2, userInfo: ["description" : "没有uid"])
            
            // 调用枚举方法
            let error = ABNetworkError.emptyUID.error()
            //告诉调用者
            finshed(result: nil, error: error)
            
            return
        }
        
        // url 
        let urlString = "https://api.weibo.com/2/users/show.json"
        
        // 参数  类型需要强转
        let parameters = [
            "access_token":ABUserAccount.loadAccount()!.access_token!,
            "uid":ABUserAccount.loadAccount()!.uid!
        ]
        
        // 发送请求
//        GET(urlString, parameters: parameters, success: { (_, result) -> Void in
//            // 成功
//            finish(result: result as? [String: AnyObject], error:nil)
//            
//            }) { (_, error) -> Void in
//            // 失败
//            finish(result: nil, error:error)
//                
//        }
        
        // 发送请求 获得网络数据
        requestGET(urlString, parameters: parameters, finshed: finshed)
        
    }
    
    // 类型别名 = typedefined
    typealias NetworkFinishedCallback = (result: [String: AnyObject]?, error: NSError?) -> ()
    
    // MARK: - 封装AFN 的 GET
    func requestGET(URLString: String, parameters: AnyObject?,finshed: NetworkFinishedCallback) {
        
        afnManager.GET(URLString, parameters: parameters, success: { (_, result) -> Void in
            // 成功
            finshed(result: result as? [String: AnyObject], error:nil)
            
            }) { (_, error) -> Void in
                // 失败
                finshed(result: nil, error:error)
        }
        
    }
    
    /// 获得本地的微博数据
    private func loadLocalStatus(finished: NetworkFinishedCallback) {
        // 获取路径
        let path = NSBundle.mainBundle().pathForResource("statuses", ofType: "json")
        
        // 加载文件数据
        let data = NSData(contentsOfFile: path!)
        
        // 转成json
        do {
            let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions(rawValue: 0))
            // 有数据
            finished(result: json as? [String : AnyObject], error: nil)
        } catch {
            print("出异常了")
        }
    }
    
    // MARK: - 获取微博数据
    /**
    加载微博数据
    - parameter since_id: 若指定此参数，则返回ID比since_id大的微博,默认为0
    - parameter max_id:   若指定此参数，则返回ID小于或等于max_id的微博,默认为0
    - parameter finished: 回调
    */
    func loadStatus(since_id: Int, max_id: Int, finished:NetworkFinishedCallback){
//        // 使用可选绑定
//        if let accessToken = ABUserAccount.loadAccount()?.access_token{
//            print("accessToken有值")
//            // url
//            let urlString = "2/statuses/home_timeline.json"
//            // 参数
//            let parameters = ["access_token": accessToken]
//            
//            if true {
//                // 发送请求
//                requestGET(urlString, parameters: parameters, finshed: finished)
//            }else{
//                // 发送请求  获得本地数据
//                loadLocalStatus(finished)
//            }
//        }
        
        guard var parameters = tokenDict() else {
            // 没有值，告诉调用者Token没有值
            finished(result: nil, error: ABNetworkError.emptyToken.error())
            
            return
        }
        
        // 添加参数 since_id 和 max_id
        // 判断是否有传since_id , max_id 
        if since_id > 0 {
            parameters["since_id"] = since_id
        }else if max_id > 0 {
            // max_id - 1 是为了将刷新的重复数据移除
            parameters["max_id"] = max_id - 1
        }
        
        // accessToken有值
        let urlString = "2/statuses/home_timeline.json"
        
        // 加载数据
        if true {
            requestGET(urlString, parameters: parameters, finshed: finished)
        } else {
            loadLocalStatus(finished)
        }
        
        
    }
    
    /// 判断access_token 是否有值，没有值返回nil，如果有值生成一个字典
    func tokenDict() -> [String: AnyObject]? {
        
        if ABUserAccount.loadAccount()?.access_token == nil {
            return nil
        }
        
        return ["access_token": ABUserAccount.loadAccount()!.access_token!]
        
    }
    
    //MARK: - 发送微博
    /**
    发送微博不带图片的微博
    - parameter status:   微博内容
    - parameter finished: 发送结果
    - 连续两次发布的微博不可以重复,内容不超过140个汉字
    */
    func sendStatus(status: String, finished: NetworkFinishedCallback){
        // url
        let urlString = "2/statuses/update.json"
        
        guard var parameters = tokenDict() else {
            print("没有Token")
            // 回调 告诉调用者
            finished(result: nil, error: ABNetworkError.emptyToken.error())
            return
        }
        // 拼接参数
        parameters["status"] = status
        // 发送请求
        afnManager.POST(urlString, parameters: parameters, success: { (_, result) -> Void in
            // 成功
            finished(result: result as? [String: AnyObject], error: nil)
            
            }) { (_, error) -> Void in
                // 失败
                finished(result: nil, error: error)                
        }
        
    }
    

}
